home *** CD-ROM | disk | FTP | other *** search
/ Aminet 50 / Aminet 50 (2002)(GTI - Schatztruhe)[!][Aug 2002].iso / Aminet / dev / basic / BlitzLstApr02.lha / BlitzLstApr02 / attachments / mail_42 / own2.lha / own.s < prev    next >
Text File  |  1999-08-15  |  5KB  |  145 lines

  1.  
  2. VERSION        EQU    1    ; version
  3. REVISION    EQU    4    ; revision
  4.  
  5.         output    "libs:own.library"    ; output name (if not implemented in your asm compiler
  6.                         ; then manually copy the output file to your libs as
  7.                         ; own.library)
  8.  
  9.         incdir    "ainc:"            ; your OS include dir
  10.         include    "exec/types.i"
  11.         include    "exec/initializers.i"
  12.         include    "exec/libraries.i"
  13.         include    "exec/lists.i"
  14.         include    "exec/resident.i"
  15.         include    "lvo.i"            ; you can just uncomment those xref's and link with
  16.                         ; amiga.lib if you don't have lvo include
  17.         incdir    ""            ; progdir:
  18.         include    "own.i"
  19.  
  20. begin        moveq    #-1,d0            ; If someone execute's this one...
  21.         rts
  22.  
  23. ; RTC_MATCHWORD indicates where RomTag-structure begins.
  24. ; Next there is poiter to the structure itself. This is meant to prevent
  25. ; interpreting any code as RomTag by mistake.
  26.  
  27. ; RTF_AUTOINIT flag will make the Exec to do the initialization of jump tables for this library
  28. ; according to the tables below. (InitStuff)
  29.  
  30. ROMTag        dc.w    RTC_MATCHWORD        ; UWORD RT_MATCHWORD
  31.         dc.l    ROMTag            ; APTR  RT_MATCHTAG
  32.         dc.l    EndOfLib        ; APTR  RT_ENDSKIP
  33.         dc.b    RTF_AUTOINIT        ; UBYTE RT_FLAGS
  34.         dc.b    VERSION            ; UBYTE RT_VERSION
  35.         dc.b    NT_LIBRARY        ; UBYTE RT_TYPE
  36.         dc.b    0            ; BYTE  RT_PRI
  37.         dc.l    LibName            ; APTR  RT_NAME
  38.         dc.l    LibId            ; APTR  RT_IDSTRING
  39.         dc.l    InitStuff        ; APTR  RT_INIT
  40.  
  41. LibName        LIBRARYNAME
  42. LibId        dc.b    'Library Identification string 1.4 (dd.mm.yyyy)',13,10,0
  43.         ds.w    0
  44.  
  45. InitStuff    dc.l    LibraryBase_SIZEOF    ; Structure size
  46.         dc.l    Functions        ; Jump table address
  47.         dc.l    LibBaseData        ; Information for the initialization
  48.         dc.l    InitRoutine        ; Own initialization routine
  49.  
  50. Functions    dc.l    r_Open            ; Open routine address
  51.         dc.l    r_Close            ; Close routine address
  52.         dc.l    r_Expunge        ; Expunge routine address
  53.         dc.l    r_Null            ; ** Reserved **
  54.         dc.l    r_First            ; First user routine address
  55.         dc.l    -1            ; Table ends
  56.  
  57. LibBaseData    INITBYTE    LN_TYPE,NT_LIBRARY
  58.         INITLONG    LN_NAME,LibName
  59.         INITBYTE    LIB_FLAGS,LIBF_SUMUSED!LIBF_CHANGED
  60.         INITWORD    LIB_VERSION,VERSION
  61.         INITWORD    LIB_REVISION,REVISION
  62.         INITLONG    LIB_IDSTRING,LibId
  63.         dc.l        0
  64.  
  65.  
  66.  
  67. InitRoutine    move.l    a5,-(sp)        ; Save A5
  68.         move.l    d0,a5            ; Library Base address
  69.         move.l    a6,libb_SysLib(a5)    ; Store ExecBase to library data
  70.         move.l    a0,libb_SegList(a5)    ; Store SegList to library data
  71.  
  72. ; If any other initialization operations are required put them here
  73.  
  74.         move.l    a5,d0            ; Return the Base addres in D0
  75.         move.l    (sp)+,a5        ; Restore A5
  76.         rts
  77.  
  78. r_Open        addq.w    #1,LIB_OPENCNT(a6)    ; New user for this library so increase opencount
  79.         bclr    #LIBB_DELEXP,libb_Flags(a6) ; ...Expunge is forbid
  80.         move.l    a6,d0            ; Return BASE address in D0
  81.         rts
  82.  
  83. r_Close        moveq    #0,d0            ; Return value
  84.         subq.w    #1,LIB_OPENCNT(a6)    ; Decrease open count
  85.         bne.s    1$            ; Is there any users?
  86.         btst    #LIBB_DELEXP,libb_Flags(a6) ; No, so we test if there are delayed Expunge request?
  87.         beq.s    1$
  88.         bsr    r_Expunge        ; Yes! so we jump to expunge
  89. 1$        rts                ; Return where ever we were called from.
  90.  
  91. r_Expunge    movem.l    d2/a5-a6,-(sp)        ; Save registers
  92.         move.l    a6,a5            ; Library base address
  93.         move.l    libb_SysLib(a5),a6    ; ExecBase
  94.         tst.w    LIB_OPENCNT(a5)        ; Library still having users?
  95.         beq.s    1$
  96.         bset    #LIBB_DELEXP,libb_Flags(a5) ; Yes! -> Delayed expunge
  97.         moveq    #0,d0            ; We return NULL
  98.         movem.l    (sp)+,d2/a5-a6
  99.         rts
  100. 1$        move.l    libb_SegList(a5),d2    ; Save SegList-address to D2
  101.         move.l    a5,a1
  102. ;        xref    _LVORemove        ; And we remove the library...
  103.         jsr    _LVORemove(a6)        ; ... from the system list
  104.  
  105. ; Any other clean up's needed? If so then do those here
  106.  
  107.         moveq    #0,d0            ; clear D0
  108.         move.l    a5,a1            ; Library base
  109.         move.w    LIB_NEGSIZE(a5),d0    ; Library negative size
  110.         sub.l    d0,a1            ; Points at the start of memory block
  111.         add.w    LIB_POSSIZE(a5),d0    ; Add library positive size
  112. ;        xref    _LVOFreeMem        ; And we...
  113.         jsr    _LVOFreeMem(a6)        ; ... free the memory
  114.         move.l    d2,d0            ; Restore SegList
  115.         movem.l    (sp)+,d2/a5-a6
  116.         rts
  117.  
  118. r_Null        moveq    #0,d0            ; Reserved routine HAVE TO RETURN NULL IN D0
  119.         rts
  120.  
  121. ******* Here are the user library routines *******
  122.  
  123. r_First
  124. ;        movem.l    d2-d4/a2,-(sp)    ; Save any Data/Address registers exept d0,d1,a0,a1
  125.                     ; which can be altered freely
  126. ; Your routine code goes here
  127.  
  128. ;        ** Example code **
  129.  
  130.         FPU            ; will enable floating point unit code generation
  131.  
  132.         fmove.l    d0,fp0        ; example code will return squareroot of the LONG you passed to it
  133.         fsqrt    fp0        ; only the integerpart is returned!!
  134.         fmove.l    fp0,d0        ; as you can see we doesn't need to save those registers in this
  135.                     ; example code because we doesn't use any of those registers!!
  136.  
  137. ;        movem.l    (sp)+,d2-d4/a2    ; Restore the saved registers
  138.         rts
  139.  
  140. **************************************************
  141.  
  142. EndOfLib    cnop    0,2
  143. end
  144.  
  145.